/**
 * Licensed to Apereo under one or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information regarding copyright ownership. Apereo
 * licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use
 * this file except in compliance with the License. You may obtain a copy of the License at the
 * following location:
 *
 * <p>http://www.apache.org/licenses/LICENSE-2.0
 *
 * <p>Unless required by applicable law or agreed to in writing, software distributed under the
 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied. See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apereo.portal.portlets.fragmentadmin;

import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import javax.portlet.PortletRequest;
import org.apereo.portal.layout.dlm.ConfigurationLoader;
import org.apereo.portal.layout.dlm.FragmentDefinition;
import org.apereo.portal.security.IdentitySwapperManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.webflow.execution.RequestContext;

/** Helper class for the FragmentAdministration web flow. */
@Service("fragmentAdministrationHelper")
public class FragmentAdministrationHelper {

    private ConfigurationLoader configurationLoader;
    private IdentitySwapperManager identitySwapperManager;

    @Autowired
    public void setConfigurationLoader(ConfigurationLoader configurationLoader) {
        this.configurationLoader = configurationLoader;
    }

    @Autowired
    public void setIdentitySwapperManager(IdentitySwapperManager identitySwapperManager) {
        this.identitySwapperManager = identitySwapperManager;
    }

    /**
     * @param remoteUser
     * @return
     */
    public Map<String, String> getAuthorizedDlmFragments(String remoteUser) {
        List<FragmentDefinition> fragments = this.configurationLoader.getFragments();
        Map<String, String> results = new TreeMap<String, String>();
        for (FragmentDefinition frag : fragments) {
            if (this.identitySwapperManager.canImpersonateUser(remoteUser, frag.getOwnerId())) {
                results.put(frag.getOwnerId(), frag.getName());
            }
        }
        return results;
    }

    /**
     * @param remoteUser
     * @param targetFragmentOwner
     * @return "yes" for success, "no" otherwise
     */
    public String swapToFragmentOwner(
            final String remoteUser,
            final String targetFragmentOwner,
            RequestContext requestContext) {
        PortletRequest portletRequest =
                (PortletRequest) requestContext.getExternalContext().getNativeRequest();
        this.identitySwapperManager.impersonateUser(
                portletRequest, remoteUser, targetFragmentOwner);
        return "yes";
    }
}
